package it.uniroma3.dia.praised.brenda.wrapper;

import it.uniroma3.dia.praised.exception.WrapperException;
import it.uniroma3.dia.praised.brenda.model.Literature;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.gargoylesoftware.htmlunit.ElementNotFoundException;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;

public class WrapperPubMed {
	
	/**
	 * Metodo che estrae la letteratura da PubMed a partire dall'URL relativo al BrendaId.
	 * Assegna all'oggetto Letteratura tramite il Side-Effect il valore trovato.
	 * 
	 * TODO: Si può trasformare in boolean tenendo traccia se l'articolo relativo esiste.
	 * 
	 * @param literature
	 * @param brendaID
	 * @param url
	 */
	public void wrapPageIntoLiterature(Literature literature, String brendaID, URL url) {
		
		String pubMedID;
		try {
			pubMedID = this.retrievePubMedId(url);
		} catch (WrapperException e) {
			e.printStackTrace();
			return;
		}
		
		literature.setBrendaId(brendaID);
		literature.setUrl(url.toString());
		literature.setPubMedId(pubMedID);
		
	}
	
	/**
	 * Metodo che data una stringa contenente un identificativo relativo a brenda restituisce il corrispondente
	 * id relativo a pubmed
	 * 
	 * @param url - url contenente l'id dell'enzima
	 * @throws WrapperException 
	 */
	public String retrievePubMedId(URL urlPage) throws WrapperException {
		try {
			
			Document doc = Jsoup.parse(urlPage, Integer.MAX_VALUE);
			Elements frames = doc.select("frame");
			
			Element frame = frames.get(1);
			String src = frame.attr("src");

			if(src.equals("no_pubmed.php4"))
				return null;
			
			return src.substring(src.lastIndexOf("=") + 1);
			
		} catch (FailingHttpStatusCodeException e) {
			throw new WrapperException(e.getMessage());
		} catch (MalformedURLException e) {
			throw new WrapperException(e.getMessage());
		} catch (IOException e) {
			throw new WrapperException(e.getMessage());
		} catch (ElementNotFoundException e) {
			throw new WrapperException(e.getMessage());
		}
	}
	
	
}
